package com.bida.core.mongo;

import java.util.List;
import java.util.Map;

import org.springframework.data.mongodb.core.query.Query;

/**
 * We define all of the method a DAO class needs to implement here in this class.
 * 
 * @param <T>
 */
public interface BaseDao<T> {

    /**
     * 通过一定的条件查询一个实体.
     * 
     * @param queryMap
     *            查询信息，相当where子句.
     * 
     * @return <T>
     */
    T selectOne(Map<String, Object> queryMap);

    /**
     * 通过ID获取记录.
     * 
     * @param id
     *            主键
     * @return <T>
     */
    T selectById(String id);

    /**
     * 通过条件查询实体(集合).
     * 
     * @param queryMap
     *            查询信息，相当where子句
     * @return <T>
     */
    List<T> selectList(Map<String, Object> queryMap);

    /**
     * 根据查询实体（集合）
     * 
     * @param query
     *            查询信息
     * @return <T>
     */
    List<T> searchList(Query query);

    /**
     * 通过条件查询更新数据.
     * 
     * @param queryMap
     *            查询信息，相当where子句
     * @param updateMap
     *            更新信息，相当set子句
     */
    void update(Map<String, Object> queryMap, Map<String, Object> updateMap);

    /**
     * 
     * @param query
     *            查询信息，相当where子句
     * @param updateMap
     *            更新信息，相当set子句
     */
    void update(Query query, Map<String, Object> updateMap);

    /**
     * Find a entity, increase special keys for number. This interface will only
     * update the first entity matched queryMap.
     * 
     * @param queryMap
     *            Query condition, map of key and value.
     * @param incrMap
     *            Increase keys and values.
     * @return The updated entity.
     */
    T increase(Map<String, Object> queryMap, Map<String, Number> incrMap);

    /**
     * 查找并更新.
     * 
     * @param queryObject
     *            查询信息，相当where子句
     * @param updateObject
     *            更新信息，相当set子句
     * @return <T>
     */
    T selectAndUpdate(Map<String, Object> queryObject, Map<String, Object> updateObject);

    /**
     * 保存一个对象到mongodb，如果该对象主键在表中存在，则更新已有记录.
     * 
     * @param bean
     */
    void save(T bean);

    /**
     * 插入对象到mongodb，如果该对象主键在表中存在，则插入失败.
     * 
     * @param bean
     */
    void insert(T bean);

    /**
     * 插入对象集合.
     * 
     * @param beans
     */
    void insertList(List<T> beans);

    /**
     * 通过id删除对象.
     * 
     * @param id
     */
    void deleteById(String id);

    /**
     * 通过条件删除实体(集合).
     * 
     * @param queryMap
     *            查询条件
     */
    void delete(Map<String, Object> queryMap);

    /**
     * 查询的记录数
     * 
     * @param query
     *            查询条件
     * @return 记录数
     */
    long count(Query query);

}
